package com.xybian.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.List;
/**
 * 系统用户实体类
 * <p>
 * 该类用于表示系统中的用户信息，包括用户名、昵称、密码、状态、邮箱、手机号码、性别、头像和用户类型等。
 * 同时还包含了创建者、创建时间、更新者、更新时间以及是否删除等记录维护信息。
 * </p>
 *
 * @author SongRenShuo
 * @since 2023-02-09
 */
@Data
@TableName("sys_user")
public class SysUser {

    /**
     * 主键ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 创建者
     */
    private String createdBy;

    /**
     * 创建时间
     */
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)        // 反序列化
    @JsonSerialize(using = LocalDateTimeSerializer.class)        // 序列化
    private LocalDateTime createdTime;

    /**
     * 更新者
     */
    private String updatedBy;

    /**
     * 更新时间
     */
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)        // 反序列化
    @JsonSerialize(using = LocalDateTimeSerializer.class)        // 序列化
    private LocalDateTime updatedTime;

    /**
     * 是否删除（0：未删除，1：已删除）
     */
    private Integer isDelete;

    /**
     * 用户名
     */
    private String userName;

    /**
     * 昵称
     */
    private String nickName;

    /**
     * 密码
     */
    @TableField("`password`")
    private String password;

    /**
     * 状态
     */
    @TableField("`status`")
    private Integer status;

    /**
     * 邮箱
     */
    private String email;

    /**
     * 手机号码
     */
    private String phonenumber;

    /**
     * 性别
     */
    private Integer sex;

    /**
     * 头像
     */
    private String avatar;

    /**
     * 用户类型
     */
    private Integer userType;

    /**
     * 用户权限（注：由于在 SysUser 类中使用了 @TableField(exist = false)，所以这个字段不会在 sys_user 表中生成，
     * 它可能用于在应用程序级别存储或处理用户的权限信息）
     */
    @TableField(exist = false)
    private List<String> permissions;
}
